#include "HashBucket.hpp"
#include "UnOrderedSet.h"
#include "UnOrderedMap.h"
//void test1()
//{
//  HashBucket<int,int> H;
//  for(int i=0;i<9;++i)
//  {
//    H.insert(make_pair(i,i));
//  }
//  H.insert(make_pair(10,10));
//  H.insert(make_pair(20,20));
//  H.insert(make_pair(30,30));
//  H.insert(make_pair(30,30));
//  H.print();
//  H.erase(1);
//  H.erase(1);
//  H.erase(1);
//  H.print();
//  H.insert(make_pair(1,1));
//  H.print();
//}
//

//struct KeyOfKV
//{
//  const string& operator()(const pair<string,int>& key)
//  {
//    return key.first;
//  }
//};
//
//void test2()
//{
//  HashBucket<string,pair<string,int>,KeyOfKV> H;
//  H.insert(make_pair("苹果",3));
//  H.insert(make_pair("菠萝",5));
//  H.insert(make_pair("西瓜",2));
//  H.insert(make_pair("西瓜",9));
//  H.insert(make_pair("火龙果",7));
//  H.insert(make_pair("哈密瓜",11));
//  H.insert(make_pair("凤梨",0));
//  H.insert(make_pair("荔枝",3));
//  H.insert(make_pair("葡萄",5));
//  H.print();
//  H.erase("西瓜");
//  H.print();
//  H.insert(make_pair("西瓜",9));
//  H.print();
//}

void test3()
{
  unordered_set<int> S;
  S.insert(1);
  S.insert(2);
  S.insert(3);
  S.insert(4);
  S.insert(5);
  S.insert(6);
  S.insert(7);
  S.print();

  for(auto e:S)
  {
    cout<<e<<endl;
  }
  cout<<endl;
  S.insert(12);
  S.print();

  S.insert(13);
  S.insert(13);
  S.insert(13);
  S.insert(14);
  S.insert(15);
  S.insert(16);
  S.print();

  S.erase(3);
  S.print();
  S.erase(13);
  S.print();
  unordered_set<int>::iterator it=S.begin();
  while(it!=S.end())
  {
    cout<<*it<<endl;
    ++it;
  }
}

void test4()
{
  unordered_map<string,int> M;
  M.insert(make_pair("苹果",3));
  M.insert(make_pair("菠萝",5));
  
  M.insert(make_pair("西瓜",2));
  M.insert(make_pair("西瓜",9));
  M.insert(make_pair("火龙果",7));
  M.insert(make_pair("哈密瓜",11));
  M.insert(make_pair("凤梨",0));
  M.insert(make_pair("荔枝",3));
  M.insert(make_pair("葡萄",5));
  M.print();
  M.erase("西瓜");
  M.print();
  M.insert(make_pair("西瓜",9));
  M.print();

  unordered_map<string,int>::iterator it=M.begin();
  while(it!=M.end())
  {
    cout<<it->first<<":"<<it->second<<endl;
    ++it;
  }

}

void test5()
{
  string goods[]={"西瓜","苹果","凤梨","葡萄","苹果","苹果","凤梨","西瓜","西瓜","西瓜","水蜜桃"};
  unordered_map<string,int> M;
  for(auto e:goods)
  {
    M[e]++;
  }
  M.print();
  for(auto e:M)
  {
    cout<<e.first<<":"<<e.second<<endl;
  }
}

int main()
{
  test5();
  return 0;
}
